# 计算期望差异指数 EDI 和 矛盾强度系数 CIC，并绘制散点图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('./workspace/data.csv', encoding='utf-8')

plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']  # 任选其一
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

# 能力自评题目列（线下交往能力自评）
ability_cols = [
	'14、请根据你的实际情况，对以下描述进行打分（1分表示“完全不符合”，2分表示“不太符合”，3分表示“一般”，4分表示“比较符合”，5分表示“完全符合”）： 与陌生人初次见面时，能自然地开启话题并维持交流。',
	'15、在小组讨论或集体活动中，能清晰表达自己的观点和想法。',
	'16、当与他人产生矛盾或分歧时，能冷静沟通并寻求解决办法。',
	'17、能准确理解他人的情绪和需求，并给予适当的回应。',
	'18、觉得自己的线下人际交往能力能满足日常生活和学习的需求。'
]

# 依赖自评题目列（线上社交依赖自评）
depend_cols = [
	'6、请根据你的实际感受，对以下描述进行打分（1分表示“完全不符合”，2分表示“不太符合”，3分表示“一般”，4分表示“比较符合”，5分表示“完全符合”）离开线上社交软件一段时间后，会感到不安或焦虑。',
	'7、习惯性频繁打开社交软件，查看消息、动态或评论。',
	'8、线下聚会时，也会频繁刷社交软件，难以专注于面对面交流。',
	'9、遇到开心或难过的事，更倾向于先在社交软件上分享，而非告诉身边的人。',
	'10、觉得自己使用线上社交软件的时间过长，但难以控制。'
]

# 转为数值
df_ability = df[ability_cols].apply(pd.to_numeric, errors='coerce')
df_depend = df[depend_cols].apply(pd.to_numeric, errors='coerce')

df['A_self'] = df_ability.mean(axis=1)
df['D_self'] = df_depend.mean(axis=1)

A_mean = df['A_self'].mean()

# 计算EDI
df['EDI'] = (df['A_self'] - A_mean) / 4

# 计算CIC
df['CIC'] = (df['A_self'] - df['D_self']).abs() / (df['A_self'] + df['D_self'])

df_valid = df.dropna(subset=['EDI', 'CIC'])

# 绘制散点图
plt.figure(figsize=(7,5))
plt.scatter(df_valid['EDI'], df_valid['CIC'], c='blue', alpha=0.7)
plt.xlabel('期望差异指数 EDI')
plt.ylabel('矛盾强度系数 CIC')
plt.title('EDI 与 CIC 散点图')
plt.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.savefig('edi_cic_scatter.png', dpi=150)
plt.show()

# 线性拟合 EDI-D_self 并计算 R^2
# 用 numpy 最小二乘法线性拟合 EDI-D_self，并计算 R^2
X = df_valid['EDI'].values
y = df_valid['D_self'].values
if len(X) > 1:
	coeffs = np.polyfit(X, y, 1)  # 一次多项式拟合
	y_pred = np.polyval(coeffs, X)
	# 计算R^2
	ss_res = np.sum((y - y_pred) ** 2)
	ss_tot = np.sum((y - np.mean(y)) ** 2)
	r2 = 1 - ss_res / ss_tot if ss_tot != 0 else float('nan')
	print(f"EDI 对 D_self 的最小二乘线性拟合: y = {coeffs[0]:.3f}x + {coeffs[1]:.3f}，R^2 = {r2:.3f}")
else:
	print("样本量不足，无法进行线性回归。")

# 绘制 EDI - D_self 散点图
plt.figure(figsize=(7,5))
plt.scatter(df_valid['EDI'], df_valid['D_self'], c='green', alpha=0.7)
plt.xlabel('期望差异指数 EDI')
plt.ylabel('依赖自评均值 D')
plt.title('EDI 与 依赖自评均值 D 散点图')
plt.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.savefig('edi_d_scatter.png', dpi=150)
plt.show()

# 计算皮尔逊相关系数
from scipy.stats import pearsonr
edi = df_valid['EDI']
cic = df_valid['CIC']
if len(edi) > 1:
	r, p = pearsonr(edi, cic)
	print(f"EDI 与 CIC 的皮尔逊相关系数 r = {r:.3f}，p值 = {p:.3g}")
else:
	print("样本量不足，无法计算皮尔逊相关系数。")

# 计算 EDI-D_self 的皮尔逊相关系数
if len(edi) > 1:
    r_edid, p_edid = pearsonr(edi, df_valid['D_self'])
    print(f"EDI 与 D_self 的皮尔逊相关系数 r = {r_edid:.3f}，p值 = {p_edid:.3g}")
else:
    print("样本量不足，无法计算 EDI 与 D_self 的皮尔逊相关系数。")